/*
 * Copyright 2010 GTUG.sk
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package sk.gtug.command.client;

import com.google.gwt.event.shared.GwtEvent;

/**
 * Root of all command events. All client side commands should extend this
 * class.
 * 
 * @author michal.jemala@gmail.com, igor.mihalik@gmail.com
 * 
 * @param <T>
 *            command response event type
 */
public class CommandEvent<T extends ResultEvent<?>> extends
		GwtEvent<CommandHandler> implements Command<T> {

	private static Type<CommandHandler> TYPE;

	/**
	 * Returns event type used to register events.
	 * 
	 * @return event type
	 */
	public static Type<CommandHandler> getType() {
		return TYPE != null ? TYPE : (TYPE = new Type<CommandHandler>());
	}

	@Override
	public final Type<CommandHandler> getAssociatedType() {
		return getType();
	}

	@Override
	protected void dispatch(CommandHandler commandHandler) {
		commandHandler.onExecute(this);
	}

	/**
	 * Command execution is not allowed on client side.
	 */
	public T execute() {
		throw new RuntimeException("Not supported on client.");
	}

}